package com.gzhu.knowledgeAdmin.common.utils;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author yangminggui
 * @create 2024-02-07 23:21
 */
public class StringUtils {
    /**
     * 提取id
     * @param expression 传来的正则表达式
     * @return
     */
    public static List<Integer> extractNumbers(String expression) {
        List<Integer> numbers = new ArrayList<>();
        Pattern pattern = Pattern.compile("\\d+"); // 正则表达式，匹配一个或多个数字
        Matcher matcher = pattern.matcher(expression);

        while (matcher.find()) {
            String match = matcher.group(); // 获取匹配的字符串
            numbers.add(Integer.parseInt(match)); // 将匹配的字符串转换为整数并添加到列表中
        }

        return numbers;
    }


    // 替换id
    /*public static String replaceIds(String logic, Map<Integer, Integer> idMap) {
        StringBuilder result = new StringBuilder();
        Deque<Integer> numStack = new ArrayDeque<>(); // 存储数字的栈

        for (int i = 0; i < logic.length(); i++) {
            char c = logic.charAt(i);
            if (Character.isDigit(c)) { // 如果当前字符是数字
                int num = 0;
                int j = i;
                while (j < logic.length() && Character.isDigit(logic.charAt(j))) {
                    num = num * 10 + (logic.charAt(j) - '0');
                    j++;
                }
                i = j - 1; // 跳过已处理的数字部分
                numStack.push(num); // 将数字推入栈中
            } else if (c == '(') { // 如果当前字符是左括号
                result.append(c); // 将左括号添加到结果中
            } else if (c == ')') { // 如果当前字符是右括号
                int num = numStack.pop(); // 从栈中弹出数字
                result.append(idMap.get(num)); // 在结果中添加数字对应的id
                result.append(c); // 将右括号添加到结果中
            } else { // 如果当前字符是逻辑运算符或逻辑非

                // 如果result为空
                if (result.length() == 0) {

                    // 弹出栈顶数字
                    if (!numStack.isEmpty()) {
                        result.append(idMap.get(numStack.pop()));
                    }

                } else {
                    while (!numStack.isEmpty() && !Character.isDigit(result.charAt(result.length() - 1))) {
                        result.append(idMap.get(numStack.pop())); // 将栈顶的数字对应的id添加到结果中，直到栈为空或遇到数字
                    }
                }
                result.append(c); // 将当前字符添加到结果中
            }
        }

        while (!numStack.isEmpty()) { // 将栈中剩余的数字对应的id添加到结果中
            result.append(idMap.get(numStack.pop()));
        }

        return result.toString();
    }*/

    public static <T> String replaceIds(String logic, Map<Integer, T> idMap) {
        StringBuilder result = new StringBuilder();
        Deque<Integer> numStack = new ArrayDeque<>(); // 存储数字的栈

        for (int i = 0; i < logic.length(); i++) {
            char c = logic.charAt(i);
            if (Character.isDigit(c)) { // 如果当前字符是数字
                int num = 0;
                int j = i;
                while (j < logic.length() && Character.isDigit(logic.charAt(j))) {
                    num = num * 10 + (logic.charAt(j) - '0');
                    j++;
                }
                i = j - 1; // 跳过已处理的数字部分
                numStack.push(num); // 将数字推入栈中
            } else if (c == '(') { // 如果当前字符是左括号
                result.append(c); // 将左括号添加到结果中
            } else if (c == ')') { // 如果当前字符是右括号
                int num = numStack.pop(); // 从栈中弹出数字
                // 添加数字对应的ID到结果中，根据idMap的类型，可能是Integer或String
                result.append(idMap.get(num));
                result.append(c); // 将右括号添加到结果中
            } else { // 如果当前字符是逻辑运算符或逻辑非

                // 如果result为空
                if (result.length() == 0) {

                    // 弹出栈顶数字
                    if (!numStack.isEmpty()) {
                        result.append(idMap.get(numStack.pop()));
                    }

                }else{
                    // 处理栈中剩余的数字
                    while (!numStack.isEmpty() && !Character.isDigit(result.charAt(result.length() - 1))) {
                        // 添加栈顶的数字对应的ID到结果中，根据idMap的类型，可能是Integer或String
                        result.append(idMap.get(numStack.pop()));
                    }
                }
                result.append(c); // 将当前字符添加到结果中
            }
        }

        // 处理栈中剩余的数字
        while (!numStack.isEmpty()) {
            // 添加栈中剩余的数字对应的ID到结果中，根据idMap的类型，可能是Integer或String
            result.append(idMap.get(numStack.pop()));
        }

        return result.toString();
    }
}
